﻿using System;
using EPiServer.Core;
using TemplateFoundation.PageTypes;
using TemplateFoundation.Tags;

namespace TemplateFoundation.Tests.Environment
{
    public class MockPageData : PageTypeBase
    {
        public MockPageData()
        {
            // Add EPiServer core properties
            AddStringProperty("PageName", string.Empty, false);
            AddPageReferenceProperty("PageLink", PageReference.EmptyReference);
            AddDateTimeProperty("PageCreated", new DateTime(1900, 1, 1));
            AddStringProperty("PageCreatedBy", string.Empty, false);
            AddDateTimeProperty("PageStartPublish", new DateTime(1900,1,1));
            AddDateTimeProperty("PageChanged", new DateTime(1900, 1, 1));
            AddStringProperty("PageChangedBy", string.Empty, false);
            AddIntegerProperty("PageWorkStatus", (int)VersionStatus.NotCreated);
            AddIntegerProperty("PageTypeID", 0);
            AddStringProperty("PageTypeName", string.Empty, false);
            AddStringProperty("PageLinkURL", string.Empty, false);
            AddStringProperty("PageGUID", Guid.NewGuid().ToString(),false);
            AddStringProperty("PageURLSegment", string.Empty, false);
            AddStringProperty("PageLanguageBranch", string.Empty, false);
            AddStringProperty("PageMasterLanguageBranch", string.Empty, false);
            
            // Initialize Template Foundation properties
            Tags=new TagCollection();
        }

        public new VersionStatus Status
        {
            get
            {
                return (VersionStatus) GetValue("PageWorkStatus");
            }
            set
            {
                SetValue("PageWorkStatus",value);
            }
        }

        public new DateTime Created
        {
            get
            {
                return (DateTime)GetValue("PageCreated");
            }
            set
            {
                SetValue("PageCreated", value);
            }
        }

        public new string CreatedBy
        {
            get
            {
                return GetValue("PageCreatedBy") as string;
            }
            set
            {
                SetValue("PageCreatedBy", value);
            }
        }

        #region Helpers

        public void AddProperty(string name, object value, PropertyDataType type)
        {
            if (type==PropertyDataType.LongString)
            {
                throw new NotSupportedException("Unable to create PropertyLongString because of dependency to AutoCompressString class in EPiServer, use AddStringProperty() method instead which uses a mock property type");
            }

            var data = PropertyData.CreatePropertyDataObject(type);
            data.Value = value;
            Property.Add(name, data);
        }

        public void AddDateTimeProperty(string name, DateTime value)
        {
            AddProperty(name, value, PropertyDataType.Date);
        }

        public void AddIntegerProperty(string name, int value)
        {
            AddProperty(name, value, PropertyDataType.Number);
        }

        public void AddPageReferenceProperty(string name, PageReference value)
        {
            AddProperty(name, value, PropertyDataType.PageReference);
        }

        public void AddStringProperty(string name, string value, bool isXhtmlString)
        {
            if (isXhtmlString)
            {
                var longStringProperty = new PropertyLongString()
                                   {
                                       Name = name,
                                       Value = value
                                   };

                Property.Add(longStringProperty);
            }
            else
            {
                AddProperty(name, value, PropertyDataType.String);
            }
        }

        #endregion

        #region Content data

        public string[] ContentPersonNames
        {
            get
            {
                return new[] 
                {
                    "Scott Adams",
                    "Leonard Adleman",
                    "Eric Allman",
                    "Richard Brodie",
                    "Danielle Bunten Berry",
                    "John D. Carmack",
                    "Dave Cutler",
                    "Ward Christensen",
                    "Brendan Eich",
                    "Bill Gates",
                    "Scott Guthrie",
                    "David Heinemeier Hansson",
                    "Anders Hejlsberg",
                    "Dave Hyatt",
                    "John Kemeny",
                    "Al Lowe",
                    "Peter Norton",
                    "Alexey Pajitnov",
                    "John Romero",
                    "Will Wright"
                };
            }
        }


        // Used for PropertyXhtmlString content properties, such as MainBody
        public string[] ContentTextParagraphs
        {
            get
            {
                return new []
                {
                    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dapibus dictum massa, fringilla iaculis lorem rhoncus vitae. Praesent hendrerit, nibh sit amet mattis rhoncus, orci velit imperdiet magna, a hendrerit magna dui id erat. Nam egestas convallis ultricies. Proin sagittis ipsum a elit ornare semper viverra tortor imperdiet. Morbi fermentum augue quis leo suscipit et lobortis tellus placerat. Cras adipiscing odio vitae tellus dignissim sit amet posuere elit posuere. Vestibulum nec eros arcu. Maecenas luctus, lectus non imperdiet commodo, lorem magna eleifend neque, non dapibus felis ligula a metus. Vestibulum semper magna eget urna imperdiet sit amet fringilla sem scelerisque. Vestibulum venenatis velit nec mi vehicula facilisis. Quisque id odio ac tortor tincidunt lobortis. Proin volutpat rutrum congue. Sed diam dui, mollis ac gravida vitae, aliquet a nisl.",
                    "Aenean pretium porta interdum. Quisque ut libero nibh, at tempor arcu. Cras a enim non massa vulputate volutpat ut eget nisl. Quisque velit magna, sodales eu ultricies eu, accumsan non elit. Suspendisse potenti. Nulla quis facilisis est. Cras id erat in diam congue eleifend a ac justo. Pellentesque quis felis sit amet augue tincidunt pretium. Sed gravida velit at ante placerat at lacinia velit suscipit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ullamcorper erat magna, quis scelerisque orci. Etiam sollicitudin tristique mollis. Aenean enim purus, gravida et pretium ultricies, suscipit ut mauris.",
                    "Morbi ut augue sit amet orci tempus dictum. Phasellus vitae facilisis augue. Morbi pellentesque luctus nunc sit amet hendrerit. Vivamus consectetur auctor orci, ut cursus tellus suscipit a. Nulla cursus arcu tincidunt velit sagittis lacinia. Nam dolor dui, ornare at commodo sed, adipiscing eget dolor. Curabitur ultrices mi ac magna vestibulum facilisis. Donec non adipiscing eros. Donec tempor hendrerit dolor ac tempus. Aliquam ut eros arcu. Morbi hendrerit laoreet magna non dignissim. Aenean vel libero nunc. Maecenas malesuada tempus lorem, at semper purus sagittis quis. Nullam aliquam lectus nec dui pharetra in fringilla neque mattis. Mauris ut vulputate turpis.",
                    "Pellentesque at lectus ac eros varius eleifend. Donec cursus consectetur nunc, sed imperdiet massa dignissim sit amet. In euismod lacus suscipit arcu iaculis et dignissim tellus placerat. Sed dignissim neque sit amet ante gravida eu tincidunt dui tristique. Suspendisse ultricies hendrerit aliquam. Vivamus eget nunc tortor, non condimentum nibh. Donec porta, dolor aliquam pulvinar rhoncus, elit dui consequat lectus, sit amet feugiat felis magna a nisl. Nullam sagittis urna sit amet velit pellentesque vitae aliquam urna pellentesque. Nullam nunc felis, congue fermentum tempus non, euismod at orci. Nunc feugiat bibendum est, ut fermentum massa dignissim in. Praesent volutpat sodales nibh, dictum faucibus turpis eleifend quis. Fusce viverra, ligula vulputate mollis tempus, eros dui luctus velit, a tincidunt ante massa eget velit.",
                    "Curabitur adipiscing, lectus id auctor rhoncus, est sapien fringilla metus, ut aliquam libero purus non ipsum. Morbi dictum porta suscipit. Donec et neque quam, et lacinia elit. Proin id odio vel mi gravida lobortis. Nunc tristique, massa vel pharetra molestie, elit dui posuere felis, sit amet tincidunt orci quam nec nisl. Morbi eleifend est non metus tincidunt viverra. Nam vehicula odio ac ipsum ornare aliquam. Integer non erat nibh, sed imperdiet odio. Donec auctor porta purus ac viverra. Aliquam commodo, justo quis hendrerit imperdiet, justo mauris fringilla augue, vitae varius ligula nisl eu diam.",
                    "Nunc mattis tellus enim, eu tempus lorem. Maecenas non leo ut libero vulputate pharetra vitae in metus. Aliquam facilisis auctor justo eu consectetur. Sed imperdiet dapibus ligula tristique ullamcorper. Sed ac dolor non libero porta congue. Sed orci eros, dignissim eget consequat at, cursus id nibh. Vivamus eget velit ac diam mattis dictum. Nulla facilisi. Nunc condimentum pretium lectus, quis ultricies diam sodales a. In laoreet laoreet posuere. Suspendisse lorem dui, tincidunt sed vehicula et, imperdiet nec erat. Suspendisse lectus sapien, ultrices venenatis lacinia id, eleifend vel tellus. Maecenas molestie convallis felis, quis rutrum lacus pretium quis. Ut ac nisi vitae nisl molestie lacinia at vel orci. Nunc eget elit magna, ac auctor felis. Proin tincidunt, magna vitae accumsan varius, lectus ipsum dignissim lorem, nec imperdiet sapien sem in urna. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed eros libero, malesuada at placerat vel, molestie nec diam. Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
                    "Sed ut placerat ante. Nulla facilisi. Praesent ornare porta massa, sed cursus turpis posuere eget. Sed et eros sapien, eget molestie magna. In hac habitasse platea dictumst. Curabitur consequat condimentum leo, nec placerat elit auctor id. Nam vestibulum tristique rhoncus. Aliquam tincidunt ipsum id leo malesuada porttitor. Donec sit amet sem id tortor rhoncus dapibus. Nam in neque nec metus aliquam molestie. In congue est nec ipsum sollicitudin mollis. Etiam blandit interdum est vitae fringilla. Cras consectetur ultricies ante, sed aliquet mi pulvinar id. In vitae tellus lectus, et viverra justo. Aliquam a massa dui. Proin iaculis mattis laoreet. Nulla commodo ultricies consectetur. Sed pretium blandit justo, a lobortis nisi egestas a.",
                    "Phasellus sed leo leo. Curabitur a augue ac leo sodales viverra ut eu nulla. Praesent quis metus nec risus condimentum posuere vel et odio. Nunc felis arcu, feugiat non tincidunt ac, mollis ut enim. Vestibulum a mauris nec diam tristique hendrerit. Integer et metus a leo malesuada porttitor. In vestibulum urna sed lacus rhoncus vitae viverra felis dignissim. Suspendisse ac sem ligula. Sed id nunc ipsum, nec varius tellus. Duis in leo at est fermentum malesuada quis ac ipsum. Ut et nisl id lorem consectetur aliquam sed ac dolor. Vivamus vel felis nec diam vulputate congue. Suspendisse sapien nibh, accumsan at aliquet nec, fringilla volutpat enim. Vestibulum justo odio, venenatis vitae laoreet vitae, placerat a elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed adipiscing, dolor eu pharetra sagittis, ante orci consequat nulla, quis porta odio augue non sem. Curabitur accumsan mollis imperdiet. Suspendisse urna nisi, hendrerit id dapibus id, lacinia a quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In elementum tincidunt leo sit amet eleifend.",
                    "Nulla ut feugiat lectus. Phasellus suscipit turpis in quam elementum luctus. Proin bibendum viverra ante tempus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nullam nec lectus tellus, ut pulvinar ipsum. Duis quis dolor urna. Quisque diam libero, tristique at vestibulum id, tristique a erat. Nulla luctus, nunc non fringilla vestibulum, nisl elit consequat metus, eu sodales orci turpis ac ligula. Donec vulputate erat et nunc pretium sed vestibulum sem rutrum. Cras feugiat placerat turpis eget suscipit. Ut id volutpat lorem.",
                    "Vivamus vel arcu eget libero auctor vestibulum sit amet eu erat. Nam mattis risus ac enim bibendum fringilla. In ultricies elit ut odio imperdiet vulputate eget at enim. Morbi viverra mattis tortor, vitae euismod risus suscipit quis. Maecenas nisi orci, feugiat et porta vestibulum, suscipit vitae libero. Suspendisse potenti. Maecenas sed diam lacus. Sed eu pulvinar magna. Aenean aliquam varius metus, ut hendrerit ipsum mattis eget. Maecenas rutrum molestie dignissim. Nam pellentesque tempor tellus, et gravida urna eleifend tincidunt. Integer feugiat sodales diam consequat pharetra. Fusce vel lobortis augue. Nullam fermentum cursus sapien, ut ultricies enim pharetra eget. In hac habitasse platea dictumst. Nulla ac turpis ipsum, ac ullamcorper est. Duis pellentesque, neque eu eleifend bibendum, augue risus pulvinar arcu, eget lobortis tellus augue et lacus. Duis a magna nec purus porttitor tempus."};
            }
        }

        #endregion
    }
}
